#pragma once

#include "NBuffer.h"
#include "Object.h"

/**
 * Monitor 数码管类
 *
 * 本类直接继承于 NBuffer 数字缓冲类，以表示数码管缓冲和
 * 中间层数字缓冲具有密切联系。本类最主要的作用就是把数字
 * 缓冲映射到八位数码管缓冲中，并根据实际需要左右移动八位
 * 缓冲中的内容。
 *
 * show[8]:
 * 数码管的八位缓冲，这里的缓冲指的是数码管的 code 字段中
 * 的内容，需要从 code[] 字段表中查询并转换，最后才置于
 * Monitor::show[8] 当中。
 *
 * offset:
 * 当前数字的相对位移，具体不太好解释，和左右移有关。举个
 * 例子：
 * 如当前 NBuffer::numbuf[12] 中有整数如下：
 * d d d d d d d d 1 2 3 4 (即整数1234，d代表不显示任何内容)
 * 此时 Monitor::offset = 7, 则载入数码管的内容为：
 * d d d d[d d d d 1 2 3 4]
 *         ^             ^
 *    offset = 7       offset = 0
 * 如当前 NBuffer::numbuf[12] 中有浮点数如下：
 *  2 3 4 2 3 6.9 0 2 0 0 0
 * 则载入数码管的内容为：
 * [2 3 4 2 3 6.9 0]2 0 0 0
 *  ^
 * offset = 11
 * 此时向左移动数码管一位：
 *  2[3 4 2 3 6.9 0 2]0 0 0
 *    ^
 * offset = 10
 * 以此类推，offset的范围在 7 - 11 之间。
 *
 * Monitor::dotpot
 * 可变小数点，和 offset 联合作用。当数字左右移动时，浮点
 * 数的小数点也要跟着左右移动，故使用该变量。每次刷新
 * Monitor 数码管对象时，都会从父类 NBuffer 中读取
 * NBuffer::dotpot 到 Monitor::dotpot 当中。
 */
OBJECT_DECLARE (Monitor, monitor)
#define MONITOR(any_obj) ((Monitor*)(any_obj))
struct _Monitor
{
        NBuffer parent_instance;
        uint8   show[8];
        uint8   offset;
        int8    dotpot;
};

/**
 * @brief 推送数码管的缓冲内容到数码管硬件上，调用了
 * Tools 当中的 _digital_tube_push() 方法进行推送。
 *
 * @param obj 本对象
 */
void monitor_push (Monitor* obj);

/**
 * @brief 向左移动数码管的显示内容。
 *
 * @param obj 本对象
 */
void monitor_move_left (Monitor* obj);

/**
 * @brief 向右移动数码管的显示内容。
 *
 * @param obj 本对象
 */
void monitor_move_right (Monitor* obj);

/**
 * @brief 从 NBuffer 父类中重新读取缓冲。
 *
 * @param obj 本对象
 * @param is_reload_offset 若是左右移动数字时的刷新操作，则
 * 该变量要置为 false。刷新新的数字时需要为 true。
 */
void monitor_refresh_cache (Monitor* obj, bool is_reload_offset);
